      1  import java.io.File;

      2  import java.io.FileNotFoundException;

      3  import java.io.PrintWriter;

      4  import java.util.Scanner;

      5

      6  /**

      7     This program encrypts a file using the Caesar cipher.

      8  */

      9  public class CaesarCipher

     10  {

     11     public static void main(String[] args) throws FileNotFoundException

     12     {

     13        final int DEFAULT_KEY = 3;

     14        int key = DEFAULT_KEY;

     15        String inFile = "";

     16        String outFile = "";

     17        int files = 0; // Number of command line arguments that are files

     18

     19        for (int i = 0; i < args.length; i++)

     20        {

     21           String arg = args[i];

     22           if (arg.charAt(0) == '-')

     23           {

     24              // It is a command line option

     25

     26              char option = arg.charAt(1);

     27              if (option == 'd') { key = -key; }

     28              else { usage(); return; }

     29           }

     30           else

     31           {

     32              // It is a file name

     33

     34              files++;

     35              if (files == 1) { inFile = arg; }

     36              else if (files == 2) { outFile = arg; }

     37           }

     38        }

     39        if (files != 2) { usage(); return; }

     40

     41        Scanner in = new Scanner(new File(inFile));

     42        in.useDelimiter(""); // Process individual characters

     43        PrintWriter out = new PrintWriter(outFile);

     44

     45        while (in.hasNext())

     46        {

     47           char from = in.next().charAt(0);

     48           char to = encrypt(from, key);

     49           out.print(to);

     50        }

     51        in.close();

     52        out.close();

     53     }

     54

     55     /**

     56        Encrypts upper- and lowercase characters by shifting them

     57        according to a key.

     58        @param ch the letter to be encrypted

     59        @param key the encryption key

     60        @return the encrypted letter

     61     */

     62     public static char encrypt(char ch, int key)

     63     {

     64        int base = 0;

     65        if ('A' <= ch && ch <= 'Z') { base = 'A'; }

     66        else if ('a' <= ch && ch <= 'z') { base = 'a'; }

     67        else { return ch; } // Not a letter

     68        int offset = ch - base + key;

     69        final int LETTERS = 26; // Number of letters in the Roman alphabet

     70        if (offset > LETTERS) { offset = offset - LETTERS; }

     71        else if (offset < 0) { offset = offset + LETTERS; }

     72        return (char) (base + offset);

     73     }

     74

     75     /**

     76        Prints a message describing proper usage.

     77     */

     78     public static void usage()

     79     {

     80        System.out.println("Usage: java CaesarCipher [-d] infile outfile");

     81     }

     82  }